package avicit.bdp.dms.prm.service;

import avicit.bdp.common.base.BaseService;
import avicit.bdp.common.service.dto.ConfigDTO;
import avicit.bdp.common.utils.BdpLogUtil;
import avicit.bdp.common.utils.ConfigUtils;
import avicit.bdp.common.utils.file.ImageToBase64Utils;
import avicit.bdp.dms.prm.dao.ConfigDao;
import avicit.platform6.core.exception.BusinessException;
import avicit.platform6.core.properties.PlatformConstant;
import com.google.common.collect.Lists;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * @author xugb
 */
@Service
public class ConfigService extends BaseService<ConfigDao, ConfigDTO> {

  @Transactional(rollbackFor = Exception.class)
  public Boolean saveLoginRes(
      String systemName,
      MultipartFile loginLogo,
      MultipartFile loginbg,
      String copyright,
      Boolean copyrightIsShow,
      MultipartFile indexLogo,
      String indexAddress,
      String layout,
      String skin,
      String domain) {
    // 系统名称
    this.mapper.updateByGroupAndKey("loginRes", "systemName", systemName);
    // 登录logo
    String loginLogoValue = "";
    if (loginLogo != null) {
      loginLogoValue = ImageToBase64Utils.generateBase64(loginLogo);
    }
    this.mapper.updateByGroupAndKey("loginRes", "loginLogo", loginLogoValue);
    // 登录背景图
    String loginbgValue = "";
    if (loginbg != null) {
      loginbgValue = ImageToBase64Utils.generateBase64(loginbg);
    }
    this.mapper.updateByGroupAndKey("loginRes", "loginbg", loginbgValue);
    // 版权说明
    this.mapper.updateByGroupAndKey("loginRes", "copyright", copyright);
    // 是否显示
    String copyrightIsShowValue = "false";
    if (copyrightIsShow != null) {
      copyrightIsShowValue = copyrightIsShow.toString();
    }
    this.mapper.updateByGroupAndKey("loginRes", "copyrightIsShow", copyrightIsShowValue);
    // 首页logo
    String indexLogoValue = "";
    if (indexLogo != null) {
      indexLogoValue = ImageToBase64Utils.generateBase64(indexLogo);
    }
    this.mapper.updateByGroupAndKey("loginRes", "indexLogo", indexLogoValue);
    // 首页地址
    this.mapper.updateByGroupAndKey("loginRes", "indexAddress", indexAddress);
    // 导航
    this.mapper.updateByGroupAndKey("loginRes", "layout", layout);
    // 皮肤
    this.mapper.updateByGroupAndKey("loginRes", "skin", skin);
    return true;
  }

  /** 查询配置列表 */
  public List<ConfigDTO> getConfigList() {

    Map<String, ConfigDTO> parantMap = new HashMap<>();
    Map<String, List<ConfigDTO>> map = new HashMap<>();
    List<ConfigDTO> list = this.mapper.getConfigList();
    List<ConfigDTO> configList = new ArrayList<>();
    if (CollectionUtils.isNotEmpty(list)) {
      for (ConfigDTO configDTO : list) {
        if (!parantMap.containsKey(configDTO.getGroupKey())) {
          ConfigDTO parant = new ConfigDTO();
          parant.setValueKey(configDTO.getGroupKey());
          parant.setValueName(configDTO.getGroupName());
          parantMap.put(configDTO.getGroupKey(), parant);
        }
        if (map.containsKey(configDTO.getGroupKey())) {
          map.get(configDTO.getGroupKey()).add(configDTO);
        } else {
          List<ConfigDTO> configDTOS = Lists.newArrayList();
          configDTOS.add(configDTO);
          map.put(configDTO.getGroupKey(), configDTOS);
        }
      }
    }

    Iterator iterator = parantMap.entrySet().iterator();
    while (iterator.hasNext()) {
      Map.Entry maps = (Map.Entry) iterator.next();
      configList.add((ConfigDTO) maps.getValue());
    }

    listConvert(configList, map);
    String logTitle = "查看系统参数";
    BdpLogUtil.log("系统参数模块", logTitle, PlatformConstant.OpType.select);
    return configList;
  }

  private void listConvert(List<ConfigDTO> configList, Map<String, List<ConfigDTO>> map) {
    for (ConfigDTO configDTO : configList) {
      List<ConfigDTO> configDTOS = map.get(configDTO.getValueKey());
      if (CollectionUtils.isNotEmpty(configDTOS)) {
        configDTO.setChildren(configDTOS);
      }
    }
  }

  @Transactional(rollbackFor = Exception.class)
  public Boolean updateConfig(ConfigDTO config) {
    try {
      updateByPrimaryKey(getConfig(config));
      // 清redis缓存
      ConfigUtils.getInstance().delCacheConfig(config.getValueKey());
      return true;
    } catch (Exception e) {
      throw new BusinessException(e.getMessage(), e);
    }
  }

  /** 修改内部查询方法 */
  private ConfigDTO getConfig(ConfigDTO config) {
    ConfigDTO oldDTO = selectByPrimaryKey(config.getId());
    if (oldDTO == null) {
      throw new BusinessException("数据不存在");
    }
    // 记录日志
    BdpLogUtil.log4Update(config, oldDTO);

    oldDTO.setValueName(config.getValueName());
    oldDTO.setRemark(config.getRemark());
    oldDTO.setValueContent(config.getValueContent());
    return oldDTO;
  }

  public List<ConfigDTO> findConfigList(ConfigDTO config) {
    try {
      return this.mapper.select(config);
    } catch (Exception e) {
      throw new BusinessException(e.getMessage(), e);
    }
  }

}
